package com.itheima.interceptor;

import com.itheima.utils.JwtUtils;
import io.jsonwebtoken.Claims;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

/**
 * @Description: TokenInterceptor 登录校验拦截器
 * @Author: HH
 * @Date: 2025/4/20 16:18
 **/
@Slf4j
@Component
public class TokenInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        // 拦截器中可以通过excludePathPatterns("/login")直接对登录请求进行放行
        // // 1. 获取请求路径
        // String requestURI = request.getRequestURI(); // /login
        // log.info("拦截到请求，请求路径为：" + requestURI);
        //
        // // 2. 判断是否为登录请求(包含login， 是登陆请求)，直接放行，记录日志
        // if (requestURI.contains("login")) {// 校验是否为登录请求
        //     log.info("登录请求，放行");
        //     return true;
        // }

        // 3. 获取请求头中的token(JWT令牌)
        String token = request.getHeader("token"); // 从请求头中获取token

        // 4. 判断token是否存在，不存在，记录日志，响应状态码设为401(未登录)
        if (token == null || token.isEmpty()) {
            log.info("请求头中没有token，用户未登录");
            // 响应状态码设为401(未登录)
            response.setStatus(401);
            return false;
        }

        // 5. 存在，解析JWT令牌，解析失败，记录日志，响应状态码设为401(未登录)
        try {
            Claims claims = JwtUtils.parseJWT(token);
        } catch (Exception e){
            log.info("解析JWT令牌失败，令牌非法");
            // 响应状态码设为401(未登录)
            response.setStatus(401);
            return false;
        }

        // 6. 放行
        return true;

    }
}
